﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Quaack.Data;

namespace Quaack.Console
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                // Print menu
                System.Console.WriteLine("Kies een actie:");
                System.Console.WriteLine("p - Toon profiel");
                System.Console.WriteLine("z - Zoeken naar gebruiker");
                System.Console.WriteLine("a - Aanmaken profiel");
                System.Console.WriteLine("b - Toon bericht");
                System.Console.WriteLine("n - Nieuw bericht");
                System.Console.WriteLine("g - Alle berichten en reacties van gebruiker");
                System.Console.WriteLine("r - Reageer");
                System.Console.WriteLine("t - Test geblokkeerd");
                System.Console.WriteLine("k - Blokkeer");
                System.Console.WriteLine("u - Deblokkeerd");
                System.Console.WriteLine("w - Wie is geblokkeerd door");
                System.Console.WriteLine("l - List reageerders");
                System.Console.WriteLine("m - Stuur mail");
                System.Console.WriteLine("v - Verifieer");
                System.Console.WriteLine("x - Exit");

                // Wacht op input
                System.Console.Write("Keuze: ");
                char key = System.Console.ReadKey().KeyChar;
                System.Console.WriteLine();

                // Gekozen actie uitvoeren
                switch (key)
                {
                    case 'p':
                        TestToonProfiel();
                        break;
                    case 'z':
                        TestZoeken();
                        break;
                    case 'a':
                        TestAanmakenProfiel();
                        break;
                    case 'b':
                        TestToonBericht();
                        break;
                    case 'n':
                        TestNieuwBericht();
                        break;
                    case 'g':
                        TestBerichtenReacties();
                        break;
                    case 'r':
                        TestReageer();
                        break;
                    case 't':
                        TestIsGeblokkeerd();
                        break;
                    case 'k':
                        TestBlokkeer();
                        break;
                    case 'u':
                        TestDeblokkeer();
                        break;
                    case 'w':
                        TestGeblokkeerdeGebruikers();
                        break;
                    case 'l':
                        TestListReageerders();
                        break;
                    case 'm':
                        TestMail();
                        break;
                    case 'v':
                        TestVerifieer();
                        break;
                    case 'x': // x of q: Database-connectie sluiten en stoppen
                    case 'q':
                        System.Console.WriteLine("Exiting...");
                        Provider.CloseConnection();
                        return;
                }

                System.Console.WriteLine();
            }
        }

        static Profiel TestToonProfiel()
        {
            System.Console.Write("Geef profiel-id op: ");
            string idAsString = System.Console.ReadLine();
            int id;
            if (int.TryParse(idAsString, out id))
            {
                Profiel profiel = Profiel.FromId(id);
                Print(profiel);
                return profiel;
            }
            else
            {
                return null;
            }
        }

        static void TestNieuwBericht()
        {
            Profiel profiel = TestToonProfiel();
            System.Console.Write("Bericht: ");
            string tekst = System.Console.ReadLine();
            Bericht bericht = profiel.NieuwBericht(tekst);
            Print(bericht);
        }

        static Bericht TestToonBericht()
        {
            System.Console.Write("Geef bericht-id op: ");
            string idAsString = System.Console.ReadLine();
            int id;
            if (int.TryParse(idAsString, out id))
            {
                Bericht bericht = Bericht.FromId(id);
                Print(bericht);
                if (bericht != null)
                {
                    System.Console.WriteLine("--- Reacties --------");
                    foreach (Bericht reactie in bericht.Reacties)
                    {
                        Print(reactie);
                    }
                }
                return bericht;
            }
            else
            {
                return null;
            }
        }

        static void TestReageer()
        {
            Bericht bericht = TestToonBericht();
            Profiel profiel = TestToonProfiel();
            System.Console.Write("Bericht: ");         
            string tekst = System.Console.ReadLine();
            Bericht reactie = bericht.Reageer(profiel, tekst);
            Print(reactie);
        }

        static void TestZoeken()
        {
            System.Console.Write("Geef een zoekterm op: ");
            string zoekterm = System.Console.ReadLine();

            List<Profiel> resultaten = Profiel.Zoeken(zoekterm);
            System.Console.WriteLine(resultaten.Count.ToString() + " resultaten: ");
            foreach (Profiel profiel in resultaten)
            {
                Print(profiel);
                System.Console.WriteLine();
            }

        }

        static void TestAanmakenProfiel()
        {
            System.Console.Write("Gebruikersnaam: ");
            string gebruikersnaam = System.Console.ReadLine();
            System.Console.Write("Email: ");
            string email = System.Console.ReadLine();
            System.Console.Write("Mobiel: ");
            string mobiel = System.Console.ReadLine();
            System.Console.Write("Avatar: ");
            string avatarLocatie = System.Console.ReadLine();
            System.Console.WriteLine("Profielschets: ");
            string profielschets = System.Console.ReadLine();

            Profiel profiel = new Profiel(gebruikersnaam, profielschets, email, mobiel, avatarLocatie);

            Print(profiel);
        }

        static void TestBerichtenReacties()
        {
            Profiel profiel = TestToonProfiel();
            System.Console.WriteLine();
            System.Console.WriteLine("Berichten");
            foreach (Bericht bericht in profiel.Berichten)
            {
                Print(bericht);
            }
            System.Console.WriteLine();
            System.Console.WriteLine("Reacties");
            foreach (Bericht bericht in profiel.Reacties)
            {
                Print(bericht);
            }
        }

        static void TestIsGeblokkeerd()
        {
            Profiel a = TestToonProfiel();
            Profiel b = TestToonProfiel();
            System.Console.WriteLine("{0} geblokkeerd door {1}: {2}", a.Id, b.Id, a.IsGeblokkeerdDoor(b));
            System.Console.WriteLine("{0} geblokkeerd door {1}: {2}", b.Id, a.Id, b.IsGeblokkeerdDoor(a));
        }

        static void TestBlokkeer()
        {
            Profiel a = TestToonProfiel();
            Profiel b = TestToonProfiel();
            a.BlokkeerGebruiker(b);
            System.Console.WriteLine("{0} heeft {1} geblokkeerd", a.Id, b.Id);
        }

        static void TestDeblokkeer()
        {
            Profiel a = TestToonProfiel();
            Profiel b = TestToonProfiel();
            a.DeblokkeerGebruiker(b);
            System.Console.WriteLine("{0} heeft {1} gedeblokkeerd", a.Id, b.Id);
        }

        static void TestGeblokkeerdeGebruikers()
        {
            Profiel profiel = TestToonProfiel();
            foreach (Profiel gebruiker in profiel.GeblokkeerdeGebruikers)
            {
                Print(gebruiker);
            }
        }

        static void TestListReageerders()
        {
            Profiel profiel = TestToonProfiel();
            foreach (Profiel reageerder in profiel.Reageerders)
            {
                Print(reageerder);
            }
        }

        static void TestMail()
        {
            System.Console.Write("E-mailadres: ");
            string email = System.Console.ReadLine();
            System.Console.Write("Onderwerp: ");
            string subject = System.Console.ReadLine();
            System.Console.Write("Body: ");
            string body = System.Console.ReadLine();

            Provider.SendMail(email, subject, body);
        }

        static void TestVerifieer()
        {
            Profiel profiel = TestToonProfiel();
            System.Console.Write("Code: ");
            string code = System.Console.ReadLine();
            bool result = profiel.Verifieer(code);
            System.Console.WriteLine("Gelukt? {0}", result);

            Print(profiel);
        }

        static void Print(Profiel profiel)
        {
            if (profiel == null)
            {
                System.Console.WriteLine("profiel == null");
                return;
            }

            System.Console.WriteLine("--- Profiel {0}: {1} ---", profiel.Id, profiel.Gebruikersnaam);
            System.Console.WriteLine("E-mail: {0}", profiel.Emailadres);
            System.Console.WriteLine("Mobiel: {0}", profiel.Mobiel);
            System.Console.WriteLine("Avatar: {0}", profiel.AvatarLocatie);
            if (profiel.IsGeverifieerd)
            {
                System.Console.WriteLine("Geverifieerd: Ja");
            }
            else
            {
                System.Console.WriteLine("Geverifieerd: Nee, uiterlijk {0} met code '{1}'", profiel.VerificatieTot, profiel.VerificatieCode);
            }
            if (profiel.IsGeblokkeerd)
            {
                System.Console.WriteLine("Geblokkeerd: Ja, sinds {0}", profiel.GeblokkeerdSinds);
            }
            else
            {
                System.Console.WriteLine("Geblokkeerd: Nee");
            }
            if (profiel.IsVerwijderd)
            {
                System.Console.WriteLine("Verwijderd: Ja, op {0}", profiel.VerwijderdSinds);
            }
            else
            {
                System.Console.WriteLine("Verwijderd: Nee");
            }
            System.Console.WriteLine();
            System.Console.WriteLine(profiel.Profielschets);
            System.Console.WriteLine("-----------------------------------");
        }

        static void Print(Bericht bericht)
        {
            if (bericht == null)
            {
                System.Console.WriteLine("bericht == null");
                return;
            }

            System.Console.WriteLine("--- Bericht {0} ---", bericht.Id);
            Print(bericht.Eigenaar);
            System.Console.WriteLine("--- Schreef op: {0} ---------------", bericht.Datum);
            System.Console.WriteLine(bericht.Tekst);

            if (bericht.IsVerwijderd)
            {
                System.Console.WriteLine("Verwijderd door ?");
            }

            System.Console.WriteLine("--- Als reactie op -------------------");
            Print(bericht.ReactieOp);


            System.Console.WriteLine("-----------------------------------");

        }

    }
}
